home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / metkit / setup.exe / EXAMPLES / DEMO / DEMO.CPP next >
C/C++ Source or Header  |  1997-06-08  |  5KB  |  130 lines

  1. //    Copyright (C) 1996, 1997 Meta Four Software.  All rights reserved.
  2. //
  3. //    An example using the MetaKit C++ persistence library
  4. //
  5. //! rev="$Id: demo.cpp,v 1.5 1997/06/08 10:46:10 jcw Exp $"
  6.  
  7. /////////////////////////////////////////////////////////////////////////////
  8. //
  9. //  This code demonstrates:
  10. //
  11. //      - Creating a persistent view and adding two data rows to it.
  12. //      - Adding a third data row using MetaKit's operator shorthands.
  13. //      - Adding an additional property without losing the existing data.
  14. //      - Storing an additional view in the data file later on.
  15. //      - Inserting a new record into one of the views in the datafile.
  16. //      - Real persistence, the data file will grow each time this is run.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19.  
  20. #include "m4kit.h"
  21.  
  22. #include <stdio.h>
  23.  
  24. int main()
  25. {
  26.         // These properties could just as well have been declared globally.
  27.     c4_StringProp pName ("name");
  28.     c4_StringProp pCountry ("country");
  29.  
  30.         // Note: it is extremely important to watch the lifetime of views vs.
  31.         // storage objects.  If a view outlives its storage object, all data
  32.         // will be loaded when the storage object is destroyed.  So much for
  33.         // on-demand loading.  To avoid this, delete/clear all views before
  34.         // the storage object is destroyed.  In this stack-based example, it
  35.         // can easily be enforced by constructing the storage objects first.
  36.     c4_Storage storage ("myfile.dat", true);
  37.  
  38.     // There are two ways to make views persistent: make sure the storage
  39.     // structure is appropriately defined - then use a view based on it,
  40.     // or build the entire structure first and then attach it to a storage
  41.     // object (causes a deep copy, requiring twice the amount of memory).
  42.     
  43.     // The first option is preferred when adding large a amount of data:
  44.     //        c4_View vAddress = storage.Define("address[name:S,country:S]");
  45.     // The second approach (used here) has the advantage that we do not need
  46.     // to describe the data structure, since Attach will determine it for us. 
  47.     
  48.         // Start with an empty view, not associated with any storage.
  49.     c4_View vAddress;
  50.  
  51.         // Let's add two rows of data to the view.
  52.     c4_Row row;
  53.  
  54.     pName (row) = "John Williams";
  55.     pCountry (row) = "UK";
  56.     vAddress.Add(row);
  57.  
  58.     pName (row) = "Paco Pena";
  59.     pCountry (row) = "Spain";
  60.     vAddress.Add(row);
  61.  
  62.         // Define the storage structure, and store the contents of vAddress.
  63.     vAddress = storage.Store("address", vAddress);
  64.  
  65.         // A simple check to prove that the data is in the view.
  66.     c4_String s1 = pName (vAddress[1]);
  67.     c4_String s2 = pCountry (vAddress[1]);
  68.     printf("The country of %s is: %s\n",
  69.              (const char*) s1, (const char*) s2);
  70.  
  71.         // This saves the data to file.
  72.     storage.Commit();   // Data file now contains 2 addresses.
  73.  
  74.         // A very compact notation to create and add a third row.
  75.     vAddress.Add(pName ["Julien Coco"] + pCountry ["Netherlands"]);
  76.  
  77.     storage.Commit();   // Data file now contains 3 addresses.
  78.  
  79.         // Add a third property to the address view ("on-the-fly").
  80.     vAddress = storage.GetAs("address[name:S,country:S,age:I]");
  81.  
  82.         // Set the new age property in one of the exisiting addresses.
  83.     c4_IntProp pAge ("age");
  84.     pAge (vAddress[1]) = 44;
  85.  
  86.     storage.Commit();   // Data file now contains 3 addresses with age field.
  87.  
  88.         // Add a second view to the data file, leaving the first view intact.
  89.     c4_View vInfo = storage.GetAs("info[version:I]");
  90.  
  91.         // Add some data, a single integer in this case.
  92.     c4_IntProp pVersion ("version");
  93.     vInfo.Add(pVersion [100]);
  94.  
  95.     storage.Commit();   // Data file now contains 3 addresses and 1 info rec.
  96.  
  97.         // Insert a row into the address view.  Note that another (duplicate)
  98.         // property definition is used here - just to show it can be done.
  99.     c4_IntProp pYears ("age");  // On file this is still the "age" field.
  100.  
  101.     vAddress.InsertAt(2, pName ["Julian Bream"] + pYears [50]);
  102.  
  103.         // Preceding commits were only included for demonstration purposes.
  104.     storage.Commit();   // Datafile now contains 4 addresses and 1 info rec.
  105.  
  106.         // To inspect the data file, use the dump utility: "DUMP MYFILE.DAT".
  107.         // It should generate the following output:
  108.         //
  109.         //      myfile.dat: 3 properties
  110.         //        address[name:S,country:S,age:I],info[version:I]
  111.         //
  112.         //       VIEW     1 rows = _:V address:V info:V
  113.         //          0: subview '_'
  114.         //          0: subview 'address'
  115.         //         VIEW     4 rows = name:S country:S age:I
  116.         //            0: 'John Williams' 'UK' 0
  117.         //            1: 'Paco Pena' 'Spain' 44
  118.         //            2: 'Julian Bream' '' 50
  119.         //            3: 'Julien Coco' 'Netherlands' 0
  120.         //          0: subview 'info'
  121.         //         VIEW     1 rows = version:I
  122.         //            0: 100
  123.         //
  124.         // Note: results will differ if this program is run more than once.
  125.  
  126.     return 0;
  127. }
  128.  
  129. /////////////////////////////////////////////////////////////////////////////
  130.